package designpatterns.proxy.dynamicproxy;

import designpatterns.proxy.staticproxy.UserServiceProxyImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.Logger;

/**
 * @Description：
 * @Author：LiDong
 * @Create：2021/3/29
 * @Version：1.0.0
 */
public class DynamicUserServiceProxy implements InvocationHandler {

    private static final Logger log = Logger.getLogger(String.valueOf(UserServiceProxyImpl.class));

    /**
     * 代理对象
     */
    private final Object object;

    public DynamicUserServiceProxy(Object object) {
        this.object = object;
    }

    /**
     * 为目标对象生成代理对象
     */
    public Object getProxyInstance() {
        log.info("-----> 开始生成代理对象...");
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
    }

    /***
     * 重写 invoke 方法再里面实现业务逻辑
     * @param object 对象
     * @param method 方法
     * @param args 参数
     * @return Object
     */
    @Override
    public Object invoke(Object object, Method method, Object[] args) throws Throwable {
        log.info("-----> invoke()...");
        //这里就可以进行所谓的AOP编程了
        //在调用具体函数方法前，执行功能处理
        log.info("Aop开始...");
        return method.invoke(this.object, args);
    }

}
